<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
//1.String字符串
console.log('---------string 字符串---------')
let s1 = 'abc'
let s2 = "AAA"// 常量区 类型string 建议使用此方式 
console.log(typeof s1) 

let s3 = new String("你好")
let s4 = new String("hhhh")
console.log(typeof s3) // 堆区 类型object 

// == 比较的是值
console.log(s1==s2) //true 
console.log(s2==s3) //true 
console.log(s3==s4) //false 

// === 比较的是值和数据类型
console.log(s1===s2) //true 
console.log(s2===s3) //false 
console.log(s3===s4) //false 

console.log('---------string API 常用方法---------')
let str1 = "2383886286@qq.com";
let str2 = "  AAA  ";

console.log(`str的长度${str1.length}`);
console.log('str1和str2拼接后 = '+str1.concat(str2));
console.log('查找指定元素的下标位置 = '+str1.indexOf('@'));
console.log('去除str2的头尾空格 '+str2.trim()+'###');
console.log('转换成大写 = '+str1.toUpperCase());
console.log('替换 = '+str1.replace('qq', 'weChat'));

// substr(from,len) from:截取的起始位置从0开始  len:截取的长度
console.log('截取字符串 = '+str1.substr(11,6));
</script>
<script>
// 2.Array 数组
console.log('---------Array 数组---------')
// 方式1：构造函数（长度初始化）
let array = new Array(5); 
// 方式2：字面量（推荐，直观）
let arr = ['apple', 'pear', 'orange']; 

// 判断是否为数组
console.log(Array.isArray(array), Array.isArray(arr)); 

// 数组转字符串（逗号分隔）
console.log(arr.toString()); // apple,pear,orange 
// 原始数组值（验证未修改原数组）
console.log(arr); // ['apple', 'pear', 'orange'] 
// valueOf 本质返回原数组（和直接输出 arr 效果一致）
console.log(arr.valueOf()); // ['apple', 'pear', 'orange'] 

console.log('---------Array API 方法---------')

// 1. concat(数组1,数组2...)：拼接数组 
let brr = [1,2,3];
let crr = ['aa','bb','cc'];
console.log('concat() = ' + arr.concat(brr, crr)); 

// 2. join("分隔符")：用分隔符拼接数组元素 
console.log('join() = ' + arr.join("#")); 
// 数组长度 
console.log('length长度 = ' + arr.length); 

// 3. splice(start,count,元素1,元素2...)：增删改数组 
// 示例1：从下标1开始，删除0个元素（不删），添加 'AAA','BBB' 
arr.splice(1,0,'AAA','BBB'); 
console.log('添加新项：' + arr); // apple,AAA,BBB,pear,orange 
// 示例2：从下标1开始，删除3个元素，添加 'CCC','DDD','EEE','FFF' 
arr.splice(1,3,'CCC','DDD','EEE','FFF'); 
console.log('添加新项：' + arr); // apple,CCC,DDD,EEE,FFF,orange 
// 4. slice(start,end)：截取数组片段（[start,end) 左闭右开 ）
console.log('截取：' + arr.slice(1,5)); // CCC,DDD,EEE,FFF 

// 5. 堆栈操作 
// push()：末尾添加；pop()：删除末尾 
console.log(arr); // ['apple','CCC','DDD','EEE','FFF','orange'] 
// push 返回新长度 
console.log(arr.push('ggg')); // 7 
console.log('push后：' + arr); // apple,CCC,DDD,EEE,FFF,orange,ggg 
// pop 返回删除的元素 
console.log(arr.pop()); // ggg 
console.log('pop后：' + arr); // apple,CCC,DDD,EEE,FFF,orange 

// shift()：删除顶端；unshift()：顶端添加 
console.log(arr); // ['apple','CCC','DDD','EEE','FFF','orange'] 
// unshift 返回新长度 
console.log(arr.unshift('hhh')); // 7 
console.log('unshift后：' + arr); // hhh,apple,CCC,DDD,EEE,FFF,orange 
// shift 返回删除的元素 
console.log(arr.shift()); // hhh 
console.log('shift后：' + arr); // apple,CCC,DDD,EEE,FFF,orange 

// 6. 排序操作 
// sort()：默认按字符排序（非数值大小 ）
console.log(arr.sort()); // ['CCC','DDD','EEE','FFF','apple','orange'] 
// 自定义排序（数值排序示例，这里数组是字符串，仅演示逻辑 ）
function compare(a, b) { 
    return a - b; 
}
// 若数组是数值，可生效：let arr1 = [2,10,5,21,60,100]; 
// console.log(arr1.sort(compare)); // [2,5,10,21,60,100] 

// 7. reverse()：反转数组 
console.log(arr.reverse()); // ['orange','apple','FFF','EEE','DDD','CCC'] 

// 8. 数组迭代 
// 方式一：for 循环（下标遍历 ）
for(let i=0; i<arr.length; i++){ 
    console.log(arr[i]); 
}

// 方式二：for...in（遍历下标 ）
for(let a in arr){ 
    console.log(a, arr[a]); 
}

// 9.every(value , index , array) 返回值是布尔类型。
// 作用是判断函数中的每个元素是否满足指定要求，若都满足要求则返回true，有任意一个不满足条件都返回false。
// 函数中有三个参数:第一个参数是元素的值，第二个参数是索引值,第三个参数是函数的调用者即数组
let flag1 = arr.every(function(a,b,c){
    // orange 0 ['orange', 'apple', 'FFF', 'EEE', 'DDD', 'CCC']
    // console.log(a , b , c)
    return a.length>=3;
})
console.log(flag1)

// 10.filter() 返回的是数组中每一个元素都符合条件的元素,组成了一个新的数组
// 函数中有三个参数:第一个参数是元素的值，第二个参数是索引值,第三个参数是函数的调用者即数组
let arr1=[18,22,10,2,1,9,23,0]
let newArr = arr1.filter(function(a,b,c){
    // console.log(a , b , c)
    return a%2==0;
})
console.log(newArr)
// 11. 清空数组 
arr1 = []; 
console.log(arr1); 
</script>

<script>
    // 3.Date 时间
    console.log('---------Date 时间---------')
    // 获取当前时间
    let now = new Date();
    console.log(now) //Mon Jun 23 2025 16:28:35 GMT+0800 (中国标准时间)
    console.log(now.toLocaleString())  //2025/6/23 16:28:35
    console.log(now.toLocaleDateString()) //2025/6/23
    console.log(now.toLocaleTimeString()) //16:28:35

    // 指定时间 2024.12.29 09:16:16
    let day = new Date(2024, 11, 29, 9, 16, 16) //注意月份要填减1后的值
    console.log(day.toLocaleString())//2024/12/29 09:16:16
    console.log("年 = " + day.getFullYear())
    console.log("月 = " + (day.getMonth() + 1)) //这里要加1，而且要加一层括号
    console.log("日 = " + day.getDate())
    console.log("星期 = " + day.getDay()) 
    console.log("时 = " + day.getHours())
    console.log("分 = " + day.getMinutes())
    console.log("秒 = " + day.getSeconds())
</script>


<script>
    //4.Math 数学
    console.log('---------Math 数学---------')
    console.log(Math.max(10,30)) // 取最大值：30 
    console.log(Math.random()*10+1) // 0~10 随机数 +1 → 1~11 范围（含小数）
    console.log(Math.ceil(10.6)) // 向上取整：11 
    console.log(Math.ceil(-10.6)) // 向上取整（负数特殊逻辑）：-10 

   
</script>

<script>
// 5.RegExp 正则表达式
console.log('---------RegExp 正则表达式---------')

// 创建正则对象 i忽略大小写 g全局匹配
// 方式一：new RegExp
let reg1 = new RegExp("\\d", "gi"); 
// 方式二：/表达式/
let reg2 = /\d/gi; 

// 正则对象常用方法
//test("字符串") 查看字符串是否符合指定的正则表达式,符合则返回true,不符合则返回false
//exec("字符串") 用正则表达式在字符串中运行查找匹配,并返回包含查找结果的一个数组 
console.log('---------正则表达式 API 方法---------')
let s = 'Hello Javascript';
let regExp1 = new RegExp("a");
console.log(`当前'${s}'是否包含字母a：${regExp1.test(s) ? '包含' : '不包含'}`);

// 全局查找字母a，统计次数
//加了 g：内部维护一个 lastIndex 指针，每次调用 exec(s) 就会从上一次匹配结束的位置继续往后找，直到找不到为止（返回 null）。
let regExp2 = new RegExp("a", "g");
let count = 0;
let index = regExp2.exec(s);
while(index!==null){
    count++;
    index = regExp2.exec(s);
}
console.log(`字符串中包含字母a的个数为：${count}`);
</script>
</html>